﻿var gameDao = require("./../dao/gameDao");
var gameConfig = require("./../config/gameConfig")
var redis_laba_win_pool = require("./../../util/redis_laba_win_pool")
let log = require("./../../util/loginfo").getInstand;

arithmetic = function (_idx) {
    //相关属性

    //可选择倍数
    var betCount = [1, 10, 20, 50, 100];

    //分数数组
    this.scoreArr = {};

    //虚拟奖池
    this.virtual_score_pool = 1000000;
    //实际奖池
    this.score_pool = [];

    //========================================
    //水位
    this.nGamblingWaterLevelGold = 0;
    //库存
    this.nGamblingBalanceGold = 0;
    //奖池
    this.nGamblingWinPool = 0;
    //大奖幸运等级
    this.nGamblingBigWinLevel = [];
    //大奖幸运概率
    this.nGamblingBigWinLuck = [];

    this.printPool = function () {
        for (var i = 0; i < betCount.length; ++i) {
            log.info("i:" + i + "-" + this.score_pool[i]);
        }
    }

    //获得实际奖池
    this.getScorePool = function (_betIdx) {
        if (this.score_pool[_betIdx]) {
            this.printPool();
            return this.score_pool[_betIdx];
        } else {
            //this.printPool();
            return 0
        }

    };

    this.getScorePoolList = function () {
        return this.score_pool;
    };

    this.getScorePoolListLength = function () {
        return betCount.length;
    };

    this.getScoreId = function () {
        return betCount;
    };


    this.getGamblingBalanceGold = function () {
        //获取库存 奖池   数据库同步使用
        var dict = {
            nGamblingBalanceGold: this.nGamblingBalanceGold,
            nGamblingWinPool: this.nGamblingWinPool
        };

        return dict;

    };
    this.addGamblingBalanceGold = function (Gold, Pool) {
        //添加库存 奖池   数据库同步使用
        this.nGamblingBalanceGold += parseInt(Gold);
        this.nGamblingWinPool += parseInt(Pool);
        log.info("添加库存:" + Gold);
        log.info("添加奖池:" + Pool);
        log.info(this.nGamblingBalanceGold);
        log.info(this.nGamblingWinPool);
        //redis存储奖池
        redis_laba_win_pool.redis_win_pool_incrby(parseInt(Pool))
    };
    this.subGamblingBalanceGold = function (Gold, Pool) {
        //减少库存   奖池 数据库同步使用
        //this.nGamblingBalanceGold-= parseInt(Gold);
        this.nGamblingWinPool -= parseInt(Pool);
        log.info("减少库存:" + Gold);
        log.info("减少奖池:" + Pool);
        log.info(this.nGamblingBalanceGold);
        log.info(this.nGamblingWinPool);

        //redis减少奖池
        redis_laba_win_pool.redis_win_pool_decrby(parseInt(Pool));
    };
    this.getGamblingBalanceLevelBigWin = function () {
        //获取库存  水位 奖池 幸运值   判断中奖使用
        var value = {
            nGamblingWaterLevelGold: this.nGamblingWaterLevelGold,
            nGamblingBalanceGold: this.nGamblingBalanceGold,
            nGamblingWinPool: this.nGamblingWinPool,
            nGamblingBigWinLevel: this.nGamblingBigWinLevel,
            nGamblingBigWinLuck: this.nGamblingBigWinLuck
        };
        return value;
    };

    //获得奖池
    this.getVirtualScorePool = function () {
        //var result = {virtual_score_pool:this.virtual_score_pool,score_pool}
        return this.virtual_score_pool;
    };

    this.init = function () {
        //初始化水位和库存
        this.initGamblingGame();
    };

    //=================================================================================================
    this.initGamblingGame = function () {
        var self = this;
        gameDao.getGamblingGame(function (Result) {

            self.nGamblingWaterLevelGold = Result[0].nGamblingWaterLevelGold;  //水位
            self.nGamblingBalanceGold = Result[0].nGamblingBalanceGold;      //库存
            self.nGamblingWinPool = Result[0].nGamblingWinPool;      //奖池

            self.nGamblingBigWinLevel = Result[0].nGamblingBigWinLevel.split(',').map(Number);  //大奖幸运等级
            self.nGamblingBigWinLuck = Result[0].nGamblingBigWinLuck.split(',').map(Number);    //大奖幸运概率


            //redis存储奖池
            redis_laba_win_pool.redis_win_pool_incrby(self.nGamblingWinPool);


            log.info("读取采池数据完毕!");
            log.info("水位:" + self.nGamblingWaterLevelGold);
            log.info("库存:" + self.nGamblingBalanceGold);
            log.info("奖池:" + self.nGamblingWinPool);
            log.info("大奖幸运等级:" + self.nGamblingBigWinLevel);
            log.info("大奖幸运概率:" + self.nGamblingBigWinLuck);
        })


    };

    this.gameProcessor = function (betInfo_list, nGamblingWaterLevelGold, is_robot) {
        //判断庄家是不是机器人
        let pos = 0;
        let betList = [0, 0, 0, 0, 0, 0, 0, 0];
        let win = -1;
        if (is_robot) {
            for (let i in betInfo_list) {
                let betInfo = betInfo_list[i];    //下注详情
                let res = parseInt(betInfo.bet_res);
                let is_jiqi = false;
                if (betInfo["is_robot"]) {
                    is_jiqi = true;
                }
                if (!is_jiqi) {
                    betList[res] += parseInt(betInfo["bet_gold"]) * gameConfig.GAME_COLORS_FRUIT_MACHINE[res];
                }
            }
            //决定结果
            let i = 0;
            while (true) {
                pos = RandomNumBoth(0, gameConfig.GAME_LINES_FRUIT_MACHINE.length - 1);
                win = gameConfig.GAME_LINES_FRUIT_MACHINE[pos];

                if (betList[win] <= nGamblingWaterLevelGold) {
                    log.info("胜利的是：" + win);
                    break;
                } else if (i == 100) {//防死循环
                    log.info("无最优解，暂定胜利者为：" + win);
                    break;
                }
                i++;
            }
        } else {
            pos = RandomNumBoth(0, gameConfig.GAME_LINES_FRUIT_MACHINE.length - 1);
            win = gameConfig.GAME_LINES_FRUIT_MACHINE[pos];
            if (betList[win] < nGamblingWaterLevelGold) {
                log.info("胜利的是：" + win);
            }
        }


        //算账
        var user_win_list = {};    //用户赢钱字典
        var user_bet_sum_list = {};  //用户下注数字典
        var user_bet_true_list = [];  //用户压对数组
        var user_robot_dict = {};  //是否机器人字典
        for (var i in betInfo_list) {
            var betInfo = betInfo_list[i];    //下注详情
            var res = parseInt(betInfo.bet_res);
            if (!user_win_list[betInfo["userId"]]) {
                user_win_list[betInfo["userId"]] = 0;
            }
            if (!user_bet_sum_list[betInfo["userId"]]) {
                user_bet_sum_list[betInfo["userId"]] = 0;
            }
            user_bet_sum_list[betInfo["userId"]] += parseInt(betInfo["bet_gold"]);
            // log.info("判断结果-------------------------------")
            // log.info(res)
            if (win == res) {
                if (user_bet_true_list.indexOf(betInfo["userId"]) == -1) {
                    user_bet_true_list.push(betInfo["userId"]);
                }

                user_win_list[betInfo["userId"]] += parseInt(betInfo["bet_gold"]) * gameConfig.GAME_COLORS_FRUIT_MACHINE[res];
            }
            user_robot_dict[betInfo["userId"]] = betInfo["is_robot"];

        }
        let dictAnalyseResults = {};
        dictAnalyseResults["win_res"] = pos;
        dictAnalyseResults["win_car"] = win;
        dictAnalyseResults["win_user_list"] = user_win_list;  //# 用户获奖结果
        dictAnalyseResults["user_bet_sum_list"] = user_bet_sum_list;  //用户下注字典
        dictAnalyseResults["user_robot_dict"] = user_robot_dict;  //是否机器人数组

        return dictAnalyseResults;

    };

    this.init();
};

function RandomNumBoth(Min, Max) {
    //生成指定范围内随机整数
    var Range = Max - Min;
    var Rand = Math.random();
    var num = Min + Math.round(Rand * Range); //四舍五入
    return num;
}

module.exports = arithmetic;